Server Side Template Injection
Server Side Template Injection Nedir Nasıl Tespit edilir?
Bu zafiyeti nerde arayabiliriz ilk başta buna değinelim. Örneğin biz alperen şeklinde bir değer girdik ve karşımıza çıkan html sayfasında bu değer bize dönüyorsa ilk arama noktasına gelmişiz demektir(Direkt olarak açık olduğunu düşünmemeliyiz, sadece test edeceğimiz bölgeyi bulduk). Ayrıyeten test yapacağımız diğer bölümler de gönderdiğimiz bir dosya olabilir veya daha önce girdiğimiz kişisel bilgilerimiz olabilir. Kısacası herhangi bir değer girebileceğimiz ve bize bir cevap döndüren yerlerde bu zafiyeti test edebiliriz küçük bir örnek verelim:
alperen.alışveriş-sitesi.com da satıcılar ürün açıklama kısmına bilgileri ekler ve artık ürün sayfasında bu yazılar karşımıza çıkar işte burada da bu zafiyet test edilebilir.
Peki Nasıl Test Ederiz?
Eğer test yapacağımız yeri bulduysak ilk başta şablon motorunu tanımalıyız, şablon motorunu yani hangi sembol kullanarak bu zafiyete ulaşacağımızı anlamamız için bir tablo ile açıklayalım.
Aşağıdaki tabloda gördüğümüz gibi test yapacağımız yere ${7*8} ile çarpma işlemi yaptırmaya çalışıyoruz eğer çarpma işlemini yaparsa bu sefer komut çalıştırıyoruz ve komutta başarılı olursa mako şablonu ile oluşturulmuş diyebiliyoruz aşağıdaki gibi adımları izleyerek bir tespitte bulunabiliriz. Ve şablonun oluşturulduğu dil ile çeşitli enjeksiyon deneme fırsatımız ve bu zafiyetin direkt olarak işletim sisteminde kod çalıştırmaya gidebilir veya uzaktan kod yürütme zafiyetine kadar ilerlememiz mümkün.
Şimdi PortSwigger’ın hazırladığı labaratuvar ile örneklere bakalım:
Burada bize ERB şablonunda bir zafiyet olduğunu ve carlosun home dizinindeki morale.txt dosyasını silmemizi istiyor.
İlk başta ERB şablonu ile ilgili bilgiler edinmemiz için dökümanlarını okuyabiliriz ya da hazır enjeksiyonlar için ERB payloads şeklinde arama yapabilirim.
Şimdi testi nereye yapabileceğimizi tespit edelim.
Ürünler ile ilgili detayları görüntüle kısmında ilk baştaki stoklar ile ilgili bir hata verdi ve html sayfasında çalıştı yani back end den gelen cevap front end bölümünde gözüktü.
Yukarıda gördüğümüz gibi message parametresindeki mesaj html sayfasında gözükmekte.
Bu kısımda erb şablon kuralına göre çarpma işlemi yaptırmaya çalışacağız ve parametreyi bozmamak için <%= 7*7 %> kodunu ya %3c%25%3d%20%37%2a%37%20%25%3e ya da <%=%207*7%20%> şeklinde encode edebilirim “%20= boşluk anlamına gelir”
Çarpma işlemini yaptırdık yani bu aşamada bir açık bulmuş olduk ve bu açığı şimdi sömürmeye ve şimdi biz bu mesajı burpsuite ile manipüle ederek sunucuya morale.txt dosyasını silmemiz için istek yapacağız.
Yazacağımız kod:
<%= system("rm /home/carlos/morale.txt") %>
Ve url encoding yaparak yolluyoruz yani:
%3c%25%3d%20%73%79%73%74%65%6d%28%22%72%6d%20%2f%68%6f%6d%65%2f%63%61%72%6c%6f%73%2f%6d%6f%72%61%6c%65%2e%74%78%74%22%29%20%25%3e
Ve dosyayı başarıyla silmiş olduk.
Bir diğer labaratuvarını inceleyelim:
Burada bize kullanıcı adı wiener şifre peter olarak giriş yapmamızı ve Tornado şablonunun güvenli çalışmadığını belirtiyor.Bizden aynı şekilde /home/carlos/ dizinindeki morale.txt dizinini silmemizi istiyor.
My account bölümünden giriş yaptık.
Karşımıza üstteki gibi bi alan çıkıyor ve Prefered Name bölümünden bir yorum yapma gibi işlemlerde nasıl gözükeceğimizi belirliyor yani first name seçersek yorumlarda peter olarak nickname ayarlarsak h0td0g şeklinde bize verilen bir nickname ile karşılaşıyoruz. Yani biz bunu ayarlayabiliyosak ve yorumlarda da response olarak görebiliyorsak bunu manipüle edebiliriz. Tornado dökümanından okuduğumuz şekilde ilk başta bizden istenen parametreyi verip ve BurpSuite üzerinden kapatacağız. Bir yeni kod çalıştırmayı deneyeceğiz.
Üsteki parametreyi aşağıdaki gibi kapatıp yeni bir kod ekleyerek sunucuya çarpma işlemi yaptırmayı deneyeceğiz.
user.first_name}}{{7*8}} şeklinde ayarlıyoruz ve bize yorum yaptığımızda veya var olan yorumumuzda isim kısmında 56 sonucunu görmemiz gerekiyor.
Ve test aşamasında zafiyet tespiti yaptık kod çalıştırabildiğimize göre işletim sisteminde dosya silmeye çalışacağız.
Tabi ki direkt olarak çalıştırmamıza izin vermedi Tornado şablonu python ile alakadar olduğu için python’un işletim sistemleri komutları çalıştırabilmemiz için bir kütüphanesini çağırmaya çalışacağız ve ardından işletim sisteminden istediğimiz komutu yazarak morale.txt dosyasını silmeye çalışacağız.
}}{% import os %}{{os.system('rm /home/carlos/morale.txt') kodunu üstteki gibi url encoding yaptık ve artık silme kodunu yollayacağız.
Ve hata kodu dönmesine rağmen silmeyi başardık.
Peki Gerçek Web Sitelerinde de Laboratuvarlardaki Gibi Çıkar Mı?
Evet bu mümkün. Tespit yaparken şablona dikkat etmeliyiz farklı dillerde denemeliyiz örneğin şablon python, java, ruby gibi farklı dillerde karşımıza çıkabilir bu yüzden test aşamasında üzerinde durmalıyız.
Aşağıda Birkaç Server Side Template Injection Örnek Raporlarını Bulabilirsiniz:
https://hackerone.com/reports/125980
https://hackerone.com/reports/423541
https://hackerone.com/reports/230234